package cz.vse.adventura.po1715.xforv00_forejt.gui._04_abstract;

import cz.pecinovsky.english.pojj.adv_framework.gui_stage.IGUI_04;
import java.awt.Dimension;
import javax.swing.JEditorPane;
import javax.swing.JScrollPane;
import javax.swing.text.Document;

/*******************************************************************************
 * Instance třídy {@code OutputPane} představují 
 *      výstupní okno, kde hra vypisuje odpověď na uživatelovy příkazy
 *
 * @author    Vladimír FOREJT
 * @version   0.00.000
 */
public class OutputPane extends JScrollPane
{
//== KONSTANTNÍ ATRIBUTY TŘÍDY =================================================
//== PROMĚNNÉ ATRIBUTY TŘÍDY ===================================================
//== STATICKÝ INICIALIZAČNÍ BLOK - STATICKÝ KONSTRUKTOR ========================
//== KONSTANTNÍ ATRIBUTY INSTANCÍ ==============================================
    
    /*Výstupní oblast, do které se zobrazují informace o průběhu hry */
    private final JEditorPane outputArea = new JEditorPane ("text/html","");
    
    /*GUI, které s panelem pracuje */
    private final IGUI_04 gui;
    
    /** */
    private final StringBuilder stringBuilder = new StringBuilder();
    
//== PROMĚNNÉ ATRIBUTY INSTANCÍ ================================================
    
    
//== PŘÍSTUPOVÉ METODY VLASTNOSTÍ TŘÍDY ========================================
//== OSTATNÍ NESOUKROMÉ METODY TŘÍDY ===========================================

//##############################################################################
//== KONSTRUKTORY A TOVÁRNÍ METODY =============================================
    /***************************************************************************
     *  Vytvoří panel, na kterém budou zobrazovány výstupy hry
     */
    OutputPane(IGUI_04 gui, Dimension outputSize) {
        this.gui = gui;
        
        /** Zakáže měnit text ve výstupní oblasti */
        outputArea.setEditable(false);
        
        //Vytvoří dekorátor, který zařídí zobrazení posuvníků v případě potřeby
        //JScrollPane scroller = new JScrollPane(outputArea);
        //scroller.setPreferredSize(outputSize);
        setViewportView(outputArea);
        setPreferredSize(outputSize);

        
    }
//== ABSTRAKTNÍ METODY =========================================================
//== PŘÍSTUPOVÉ METODY VLASTNOSTÍ INSTANCÍ =====================================
//== OSTATNÍ NESOUKROMÉ METODY INSTANCÍ ========================================
    
    /***************************************************************************
     * Inicializuje oblast s vystupujícím textem.
     * Zde je potřeba při každém spuštění hry smazat
     * případný dříve vypsaný text, aby hra začala s čistou oblastí.
     */
    void initialize() {
//        outputArea.setText("");
        stringBuilder.setLength(0); //Prázdný - nula znaků platných
        stringBuilder.append("<html>");
    }
    
    /***************************************************************************
     * Aktualizuje oblast s vystupujícím textem, tj.
     * přečte si zadaný příkaz a zapíše jej do výstupní oblasti,
     * zjistí, jak na tento příkaz hra zareaguje
     * a zapíše její odpověď do výstupní oblasti.
     */
    void update() {
        String command = gui.getCommand();
        stringBuilder.append("<br><b>").append(command).append("</b><br>");
        
        String answer = gui.getGame().executeCommand(command);
        stringBuilder.append(answer).append("<br>");
        //nahradit HTML odřádkování
        String outputText = (stringBuilder.toString() + "</html>").replaceAll("\n", "<br>");
        outputArea.setText(outputText);
        Document document = outputArea.getDocument();
        int position = document.getLength(); //Má už jen viditelné znaky
        outputArea.setCaretPosition(position);
    }
    
//== SOUKROMÉ A POMOCNÉ METODY TŘÍDY ===========================================
//== SOUKROMÉ A POMOCNÉ METODY INSTANCÍ ========================================
//== INTERNÍ DATOVÉ TYPY =======================================================
//== TESTY A METODA MAIN =======================================================
//
//    /***************************************************************************
//     * Testovací metoda.
//     */
//    public static void test()
//    {
//        OutputPane inst = new OutputPane();
//    }
//    /** @param args Parametry příkazového řádku - nepoužívané. */
//    public static void main( String[] args )  {  test();  }
}
